package br.com.site;

import java.util.ArrayList;
import java.util.List;

import model.Equipamento;
import model.Equipe;
import model.Estrutura;
import model.Instituicao;
import model.PDI;
import model.Perigo;
import model.Unidade;
import model.Veiculo;
import model.Vitima;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TableLayout;
import android.widget.TextView;

import com.google.android.maps.GeoPoint;

public class NovoEquipe extends Activity{
	
	private List<Estrutura> listaEstruturas;
	private List<Equipamento> listaEquipamentos;
	private List<Perigo> listaPerigos;
	private List<Instituicao> listaInstituicoes;
	private List<Unidade> listaUnidades;
	
	private TableLayout tlTeamDelete;
	
	private EditText etTeamIdentificacao, etTeamChefe, etTeamQuantidadeMembros, etTeamQuantidadeMembrosFeridos, etTeamTarefaAtual;
	private Spinner spTeamFuncao, spTeamInst, spTeamUnid, spTeamEstrut, spTeamEquipamento, spTeamPerigo;
	private ImageButton salvar;
	private TextView tvTit;
	
	private ArrayAdapter<CharSequence> adtTeamFuncao, adtTeamInst, adtTeamUnid;
	private ArrayAdapter<CharSequence> adtTeamEstrut, adtTeamEquipamento, adtTeamPerigo;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.novo_equipe);
		
		carregaViews();
		
		tlTeamDelete.setVisibility(View.GONE);
		spTeamFuncao.setAdapter(adtTeamFuncao);
		
		setPDIArrayAdapter(adtTeamInst, spTeamInst, listaInstituicoes);
		setPDIArrayAdapter(adtTeamUnid, spTeamUnid, listaUnidades);
		setPDIArrayAdapter(adtTeamEstrut, spTeamEstrut, listaEstruturas);
		setPDIArrayAdapter(adtTeamEquipamento, spTeamEquipamento, listaEquipamentos);
		setPDIArrayAdapter(adtTeamPerigo, spTeamPerigo, listaPerigos);
    	
        if(!Global.editarPDI){
        	novoPDI();
        }else{
        	editarPDI();
        }
    
	}
		
	private void novoPDI() {
		salvar.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View v) {
				salvar.setImageResource(R.drawable.bt_aplicar);
				GeoPoint temp = new GeoPoint(0, 0);
				String identif = etTeamIdentificacao.getText().toString();
				String chefe = etTeamChefe.getText().toString();
				String textoBalao = "";
				
				
				int qtdMembros = 0;
				
				try{
					qtdMembros = Integer.parseInt(etTeamQuantidadeMembros.getText().toString());
					textoBalao += qtdMembros + " membros";
				}catch(NumberFormatException nfe){
					qtdMembros = -1;
				}
				
				int qtdMembrosFeridos = 0;
				
				try{
					qtdMembrosFeridos = Integer.parseInt(etTeamQuantidadeMembrosFeridos.getText().toString());
					textoBalao += ", " + qtdMembrosFeridos + " feridos";
				}catch(NumberFormatException nfe){
					qtdMembrosFeridos = -1;
				}
				
				int tipoDeFuncao = 7;
				if (spTeamFuncao.getSelectedItem().equals("Desconhecido")){
					tipoDeFuncao = 0;
				}else if (spTeamFuncao.getSelectedItem().equals("Resgate")){
					tipoDeFuncao = 1;
					textoBalao += ", Resgate";
				}else if (spTeamFuncao.getSelectedItem().equals("Administração")){
					tipoDeFuncao = 2;
					textoBalao += ", Administração";
				}else if (spTeamFuncao.getSelectedItem().equals("Médica")){
					tipoDeFuncao = 3;
					textoBalao += ", Médica";
				}else if (spTeamFuncao.getSelectedItem().equals("Segurança")){
					tipoDeFuncao = 4;
					textoBalao += ", Segurança";
				}else if (spTeamFuncao.getSelectedItem().equals("Voluntários")){
					tipoDeFuncao = 5;
					textoBalao += ", Voluntários";
				}else if (spTeamFuncao.getSelectedItem().equals("Serviços Públicos")){
					tipoDeFuncao = 6;
					textoBalao += ", Serviços Públicos";
				}else{
					tipoDeFuncao = 7;
				}
				
				String tarefaAt = etTeamTarefaAtual.getText().toString();
				if (tarefaAt.equals("")){
					tarefaAt = "Desconhecido";
				}
				
				Instituicao teamInst = null;
				for (Instituicao i : listaInstituicoes) {
					if (spTeamInst.getSelectedItem().equals(i.toString())){
						teamInst = i;
						textoBalao += "\nInstituição: " + i.getTipoDeInstituicao();
					}else{
						continue;
					}
				}
				
				Unidade teamUnid = null;
				for (Unidade u : listaUnidades) {
					if (spTeamUnid.getSelectedItem().equals(u.toString())){
						teamUnid = u;
					}else{
						continue;
					}
				}
				
				Estrutura teamEstrut = null;
				for (Estrutura e : listaEstruturas) {
					if (spTeamEstrut.getSelectedItem().equals(e.toString())){
						teamEstrut = e;
					}else{
						continue;
					}
				}
				
				Equipamento teamEquip = null;
				for (Equipamento eq : listaEquipamentos) {
					if (spTeamEquipamento.getSelectedItem().equals(eq.toString())){
						teamEquip = eq;
					}else{
						continue;
					}
				}
				
				Perigo teamPerigo = null;
				for (Perigo p : listaPerigos) {
					if (spTeamPerigo.getSelectedItem().equals(p.toString())){
						teamPerigo = p;
					}else{
						continue;
					}
				}
				
				if(teamEstrut != null) textoBalao += "\nEstrutura: " + teamEstrut.toString();
				if(teamEquip != null) textoBalao += "\nEquipamento: " + teamEquip.toString();
				if(teamPerigo != null) textoBalao += "\nPerigo: " + teamPerigo.toString();
				
				Equipe time = new Equipe(temp,
						identif, textoBalao,
						teamEstrut, teamEquip, teamPerigo,
						identif, chefe,
						teamInst, teamUnid,
						tipoDeFuncao, qtdMembros, qtdMembrosFeridos, tarefaAt);
				
				if(teamEstrut != null) teamEstrut.setEquipe(time);
				if(teamEquip != null) teamEquip.setEquipe(time);
				if(teamPerigo != null) teamPerigo.setEquipe(time);
				
				br.com.site.MainActivity.objetoPassado = time;
				Global.novoPdi = true;
				finish();
				br.com.site.MainActivity.exibeToast(getApplicationContext(), "Toque na tela para posicionar a equipe.");
			}
		});		
	}

	private void editarPDI() {
		salvar.setImageResource(R.drawable.bt_edit);
    	tvTit.setText("Editar Equipe");
    	tlTeamDelete.setVisibility(View.VISIBLE);
    	
    	final TextView tvDel = (TextView) findViewById(R.novo_equipe.tvDelTeam);
    	final ImageView ivDel = (ImageView) findViewById(R.novo_equipe.ivDelTeam);
    	
    	final Equipe e = (Equipe) Global.pdiEdicao;
    	
    	tvDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(e);
			}
		});
    	
    	ivDel.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View view) {
				deletaObj(e);
			}
		});

    	etTeamIdentificacao.setText(e.getIdentificacao());
    	etTeamChefe.setText(e.getChefe());
    	setNumEditText(e.getQtdMembros(), etTeamQuantidadeMembros);
    	setNumEditText(e.getQtdMembrosFeridos(), etTeamQuantidadeMembrosFeridos);
    	etTeamTarefaAtual.setText(e.getTarefaAtual());
    	
    	setAdapterPositionFromString(spTeamFuncao, e.getTipoDeFuncao());
    	
    	try{
    		setAdapterPositionFromString(spTeamInst, e.getInst().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spTeamInst, "Desconhecido");
		}try{
    		setAdapterPositionFromString(spTeamUnid, e.getUnid().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spTeamUnid, "Desconhecido");
		}try{
    		setAdapterPositionFromString(spTeamEstrut, e.getEstrutura().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spTeamEstrut, "Desconhecido");
		}try{
    		setAdapterPositionFromString(spTeamEquipamento, e.getEquipamento().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spTeamEquipamento, "Desconhecido");
		}try{
    		setAdapterPositionFromString(spTeamPerigo, e.getPerigo().toString());
    	}catch (NullPointerException ex) {
    		setAdapterPositionFromString(spTeamPerigo, "Desconhecido");
		}
    	
    	salvar.setOnClickListener(new OnClickListener() {			
			@Override
			public void onClick(View view) {
				MainActivity.listaEquipes.remove(e);
				
				String textoBalao = "";
				
				e.setIdentificacao(setStringEditText(etTeamIdentificacao));
				e.setChefe(setStringEditText(etTeamChefe));
				
				
				int qtdMembros = 0;
				
				try{
					qtdMembros = Integer.parseInt(etTeamQuantidadeMembros.getText().toString());
					textoBalao += qtdMembros + " membros";
				}catch(NumberFormatException nfe){
					qtdMembros = -1;
				}
				e.setQtdMembros(qtdMembros);
				
				int qtdMembrosFeridos = 0;
				
				try{
					qtdMembrosFeridos = Integer.parseInt(etTeamQuantidadeMembrosFeridos.getText().toString());
					textoBalao += ", " + qtdMembrosFeridos + " feridos";
				}catch(NumberFormatException nfe){
					qtdMembrosFeridos = -1;
				}
				e.setQtdMembrosFeridos(qtdMembrosFeridos);
				
				int tipoDeFuncao = 7;
				if (spTeamFuncao.getSelectedItem().equals("Desconhecido")){
					tipoDeFuncao = 0;
				}else if (spTeamFuncao.getSelectedItem().equals("Resgate")){
					tipoDeFuncao = 1;
					textoBalao += ", Resgate";
				}else if (spTeamFuncao.getSelectedItem().equals("Administração")){
					tipoDeFuncao = 2;
					textoBalao += ", Administração";
				}else if (spTeamFuncao.getSelectedItem().equals("Médica")){
					tipoDeFuncao = 3;
					textoBalao += ", Médica";
				}else if (spTeamFuncao.getSelectedItem().equals("Segurança")){
					tipoDeFuncao = 4;
					textoBalao += ", Segurança";
				}else if (spTeamFuncao.getSelectedItem().equals("Voluntários")){
					tipoDeFuncao = 5;
					textoBalao += ", Voluntários";
				}else if (spTeamFuncao.getSelectedItem().equals("Serviços Públicos")){
					tipoDeFuncao = 6;
					textoBalao += ", Serviços Públicos";
				}else{
					tipoDeFuncao = 7;
				}
				e.setTipoDeFuncao(tipoDeFuncao);
				
				
				String tarefaAt = etTeamTarefaAtual.getText().toString();
				if (tarefaAt.equals("")){
					tarefaAt = "Desconhecido";
				}
				e.setTarefaAtual(tarefaAt);
				
				Instituicao teamInst = null;
				for (Instituicao i : listaInstituicoes) {
					if (spTeamInst.getSelectedItem().equals(i.toString())){
						teamInst = i;
						textoBalao += "\nInstituição: " + i.getTipoDeInstituicao();
					}else{
						continue;
					}
				}
				
				Unidade teamUnid = null;
				for (Unidade u : listaUnidades) {
					if (spTeamUnid.getSelectedItem().equals(u.toString())){
						teamUnid = u;
					}else{
						continue;
					}
				}
				
				Estrutura teamEstrut = null;
				for (Estrutura e : listaEstruturas) {
					if (spTeamEstrut.getSelectedItem().equals(e.toString())){
						teamEstrut = e;
					}else{
						continue;
					}
				}
				
				Equipamento teamEquip = null;
				for (Equipamento eq : listaEquipamentos) {
					if (spTeamEquipamento.getSelectedItem().equals(eq.toString())){
						teamEquip = eq;
					}else{
						continue;
					}
				}
				
				Perigo teamPerigo = null;
				for (Perigo p : listaPerigos) {
					if (spTeamPerigo.getSelectedItem().equals(p.toString())){
						teamPerigo = p;
					}else{
						continue;
					}
				}
				
				if(teamUnid != null){
					e.setUnid(teamUnid);
				}
				if(teamInst != null){
					e.setInst(teamInst);
				}
				if(teamEstrut != null){
					textoBalao += "\nEstrutura: " + teamEstrut.toString();
					e.setEstrutura(teamEstrut);
				}
				if(teamEquip != null){
					textoBalao += "\nEquipamento: " + teamEquip.toString();
					e.setEquipamento(teamEquip);
				}
				if(teamPerigo != null){
					textoBalao += "\nPerigo: " + teamPerigo.toString();
					e.setPerigo(teamPerigo);
				}
				
				e.setTextoBalao(textoBalao);
				
				try{
					teamEstrut.setEquipe(e);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}try{
					teamEquip.setEquipe(e);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}try{
					teamPerigo.setEquipe(e);
				}catch(NullPointerException exc){
					//TODO o que fazer se o user cadastra um equipamento e descadastra?
				}
				
				atualizaObj(e);
            	finish();
    			Global.editarPDI=false;
    			MainActivity.exibeToast(getApplicationContext(), "Dados atualizados");
			}
		});
	}

	private void carregaViews() {
		listaEstruturas = br.com.site.MainActivity.listaEstruturas;
		listaEquipamentos = br.com.site.MainActivity.listaEquipamentos;
		listaPerigos = br.com.site.MainActivity.listaPerigos;
		listaInstituicoes = br.com.site.MainActivity.listaInstituicoes;
		listaUnidades = br.com.site.MainActivity.listaUnidades;
		
		tlTeamDelete = (TableLayout) findViewById(R.novo_equipe.tlTeamDelete);
		
		etTeamIdentificacao = (EditText) findViewById(R.novo_equipe.etTeamIdentificacao);
		etTeamChefe = (EditText) findViewById(R.novo_equipe.etTeamChefe);
		etTeamQuantidadeMembros = (EditText) findViewById(R.novo_equipe.etTeamQuantidadeMembros);
		etTeamQuantidadeMembrosFeridos = (EditText) findViewById(R.novo_equipe.etTeamQtdMembrosFeridos);
		etTeamTarefaAtual = (EditText) findViewById(R.novo_equipe.etTeamTarefaAtual);
    	
		spTeamFuncao = (Spinner) findViewById(R.novo_equipe.spTeamFuncao);
		spTeamInst = (Spinner) findViewById(R.novo_equipe.spTeamInstituicao);
		spTeamUnid = (Spinner) findViewById(R.novo_equipe.spTeamUnidade);
		spTeamEstrut = (Spinner) findViewById(R.novo_equipe.spTeamEstrutura);
		spTeamEquipamento = (Spinner) findViewById(R.novo_equipe.spTeamEquipamento);
		spTeamPerigo = (Spinner) findViewById(R.novo_equipe.spTeamPerigo);
    	
    	salvar = (ImageButton) findViewById(R.novo_equipe.teamSalvar);
    	tvTit = (TextView) findViewById(R.novo_equipe.tvTeamTit);
    	
    	adtTeamFuncao = ArrayAdapter.createFromResource(this, R.array.equipeFuncao_array, R.layout.textviewmodelo);
    	adtTeamFuncao.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	
    	adtTeamInst = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
    	adtTeamInst.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adtTeamUnid = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtTeamUnid.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adtTeamEstrut = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtTeamEstrut.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adtTeamEquipamento = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtTeamEquipamento.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

        adtTeamPerigo = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
        adtTeamPerigo.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    	
	}

	/**
	 * Este método aplicará a um spinner um ArrayAdapter populado pelos toStrings de cada PDI contido numa lista de PDIs
	 * @param aAdapter ArrayAdapter que será aplicado no Spinner
	 * @param sp Spinner que receberá os toStrings dos PDIs
	 * @param l Lista de PDIs a serem adicionados ao ArrayAdapter
	 */
	private void setPDIArrayAdapter(ArrayAdapter<CharSequence> aAdapter, Spinner sp, List<?> l){
		aAdapter = new ArrayAdapter<CharSequence>(this, R.layout.textviewmodelo);
		aAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        
		sp.setAdapter(aAdapter);
        if(l.size() < 1){
        	aAdapter.add("Desconhecido");
        }else{
        	aAdapter.add("Desconhecido");
	        for (int j = 0; j < l.size(); j++) {
	        	aAdapter.add(l.get(j).toString());
			}
    	}
	}

	public void setAdapterPositionFromString(Spinner spinner, String texto){
		@SuppressWarnings({ "unchecked", "rawtypes" })
		ArrayAdapter<CharSequence> adapter = (ArrayAdapter) spinner.getAdapter();
		try{
			int pos = adapter.getPosition(texto);
			spinner.setSelection(pos);
		}catch(NullPointerException exc){
			spinner.setSelection(0);
		}
	}
	
	public static void atualizaObj(Equipe eqp){
		MainActivity.equipeOverlays.clear();
		for (Equipe e : MainActivity.listaEquipes) {
			if(!e.equals(eqp)){
				MainActivity.equipeOverlays.addOverlay(e.getOverlayItem(), e);
			}
		}
		MainActivity.equipeOverlays.addOverlay(eqp.getOverlayItem(), eqp);
		MainActivity.listaEquipes.add(eqp);
		MainActivity.equipeOverlays.hideBalloon();
	}
	
	public void deletaObj(final Equipe eq){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle("Excluir Equipe")
			   .setMessage("Tem certeza?")
		       .setCancelable(false)
		       .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		        	   ArrayList<PDI> links = Global.getArrayDeLinks(eq);
		        	   if(!links.equals(null) && links.size()>0){
		        		   for (PDI pdi : links) {
		        			   if(pdi instanceof Veiculo){
		        				   Veiculo v = (Veiculo) pdi;
		        				   v.setEquipe(null);
		        				   v.atualizaTextoBalao();
		        				   NovoVeiculo.atualizaObj(v);
		        			   }
		        			   if(pdi instanceof Estrutura){
		        				   Estrutura es = (Estrutura) pdi;
		        				   es.setEquipe(null);
		        				   es.atualizaTextoBalao();
		        				   NovoEstrutura.atualizaObj(es);
		        			   }
		        			   if(pdi instanceof Equipamento){
		        				   Equipamento eqp = (Equipamento) pdi;
		        				   eqp.setEquipe(null);
		        				   eqp.atualizaTextoBalao();
		        				   NovoEquipamento.atualizaObj(eqp);
		        			   }
		        			   if(pdi instanceof Perigo){
		        				   Perigo p = (Perigo) pdi;
		        				   p.setEquipe(null);
		        				   p.atualizaTextoBalao();
		        				   NovoPerigo.atualizaObj(p);
		        			   }
		        			   if(pdi instanceof Vitima){
		        				   Vitima vi = (Vitima) pdi;
		        				   vi.setEquipe(null);
		        				   vi.atualizaTextoBalao();
		        				   NovoVitima.atualizaObj(vi);
		        			   }
		        		   }
		        	   }
		        	   
		        	   MainActivity.equipeOverlays.clear();
		        	   MainActivity.listaEquipes.remove(eq);
		        	   for (Equipe e : MainActivity.listaEquipes) {
		        		   MainActivity.vitimaOverlays.addOverlay(e.getOverlayItem(), e);
		        	   }
		        	   MainActivity.equipeOverlays.hideBalloon();
		        	   finish();
		        	   Global.editarPDI=false;
		           }
		       })
		       .setNegativeButton("Não", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       });
		builder.show();
	}

	public void setNumEditText(int propriedade, EditText et){
		String s = "";
    	if(propriedade >= 0) s = String.valueOf(propriedade);
    	et.setText(s);
	}
	
	public String setStringEditText(EditText et){
		if (et.getText().toString().equals("")) return "Desconhecido";
		return et.getText().toString();
	}
	
	@Override
	public void onBackPressed() {
		Global.editarPDI=false;
		super.onBackPressed();
	}
}
